#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

/* lua_test.lua内容
function toString(var)
    return "hello word" .. var
end

function toNumber(n)
    return n * 123
end


function toBoolean(status)
    if status < 10 then
        return false
    else
        return true
    end
end
*/
void Widget::on_pushButton_clicked()
{
    // 创建Lua状态
    L = luaL_newstate();
    // 打开标准库
    luaL_openlibs(L);

    if(luaL_dofile(L,script_name.toLatin1().data()) != LUA_OK)
    {
        debug("加载lua文件失败");
    }
    else {
        //类似命令行打印
        //luaL_dostring(L,"print(123)");
        debug("找到lua文件");
        //获取number结果
        lua_getglobal(L,"toNumber"); // 获取Lua函数
        lua_pushnumber(L, 3); // 第一个参数
        //lua_call(L,0,1);
        // 调用Lua函数 一个参数 一个结果
        lua_call(L,1,1);
        int iRet = (int)lua_tonumber(L,-1);
        debug(QString::number(iRet));
        lua_pop(L,1);

        //获取字符串结果
        lua_getglobal(L,"toString");
        QString arg = "lua is good language";
        //QString需要转换成char类型进行传递，否则参数报错
        lua_pushstring(L,arg.toLatin1().data());
        lua_call(L,1,1);    //执行方法
        const char *cRet = lua_tostring(L,1); //获取方法结果
        debug(QString(cRet));
        lua_pop(L,1);
#if 1
        //获取字符串结果
        lua_getglobal(L,"toBoolean");
        lua_pushnumber(L,21);
        lua_call(L,1,1);    //执行方法
        bool bRet = lua_toboolean(L,1); //获取方法结果
        if(bRet)
        {
            debug("True");
        }
        else{
            debug("False");
        }
        lua_pop(L,1);
#endif
    }
    // 关闭lua状态
    lua_close(L);
    L = nullptr;
}

void Widget::on_pushButton_2_clicked()
{
    // 创建Lua状态
    L = luaL_newstate();
    // 打开标准库
    luaL_openlibs(L);

    if(luaL_dofile(L,script_name.toLatin1().data()) != LUA_OK)
    {
        debug("加载lua文件失败");
    }
    else{
        lua_getglobal(L,"getTable");
        if (lua_isnil(L, -1))
        {
            qDebug() << "Error: 'getTable' is nil";
        }
        else {
            //qDebug() << "'getTable' is ok";
        }

        lua_pcall(L,0,1,0);

        if(lua_istable(L,-1))
        {
            int idx = lua_gettop(L);    //获取栈上内容
            lua_pushnil(L); //栈上table第一组没有值，压入nil充当起始Key Value
            //qDebug() << "istable";

            while (lua_next(L,idx) != 0) {
                if(lua_isstring(L,-1))
                {
                    QString log = QString("Value=%2").arg(lua_tostring(L,-1));
                    debug(log);
                }
                lua_pop(L, 1);
            }
        }

        lua_pop(L, 1);  // remove nil
    }

    // 关闭lua状态
    lua_close(L);
    L = nullptr;
}

void Widget::on_pushButton_3_clicked()
{
    L = luaL_newstate();
    luaL_openlibs(L);

    if(luaL_dofile(L,script_name.toLatin1().data()) == LUA_OK)
    {
        lua_getglobal(L,"getCommand");
        if(!lua_isnil(L,-1))
        {
            lua_pcall(L,0,1,0);
            if(lua_isstring(L,-1))
            {
                QString log = lua_tostring(L,-1);
                debug(log);
            }
        }
        lua_pop(L,1);

        lua_getglobal(L,"GetCmd");
        /*
        QString arg1,arg2,arg3,arg4;
        arg1 = "C#";
        arg2 = "C++";
        arg3 = "Python";
        arg4 = "Lua";
        lua_pushstring(L,arg1.toLatin1());
        lua_pushstring(L,arg2.toLatin1());
        lua_pushstring(L,arg3.toLatin1());
        lua_pushstring(L,arg4.toLatin1()); */
        QStringList args = {"C#","C++","Python","Lua"};
        foreach(QString arg,args)
        {
            lua_pushstring(L,arg.toLatin1());
        }
        if(!lua_isnil(L,-1))
        {
            lua_pcall(L,4,1,0);
            //lua_call(L,4,1);
            if(lua_isstring(L,-1))
            {
                QString log = lua_tostring(L,-1);
                debug(log);
            }
        }
        lua_pop(L,1);

        lua_newtable(L);      // 创建一个新 table 并压入栈
        /*
        lua_pushnumber(L, 1); // 压入 key
        lua_pushstring(L, "C#");    // 压入 value
        lua_settable(L, -3);       // 设置 key-value 分别在栈的 -2 和 -1 位置, table 在 -3
        lua_pushnumber(L, 2);
        lua_pushstring(L, "C++");
        lua_settable(L, -3);
        lua_pushnumber(L, 3);
        lua_pushstring(L, "Python");
        lua_settable(L, -3);
        lua_pushnumber(L, 4);
        lua_pushstring(L, "Lua");
        lua_settable(L, -3);
        lua_pushnumber(L, 5);
        lua_pushstring(L, "Java");
        lua_settable(L, -3);
        lua_pushnumber(L, 6);
        lua_pushstring(L, "Go");
        lua_settable(L, -3);    */
        QMap<int,QString> content;
        content.insert(1,"C#");
        content.insert(2,"C++");
        content.insert(3,"Python");
        content.insert(4,"Lua");
        content.insert(5,"Java");
        content.insert(6,"Go");
        for(QMap<int,QString>::const_iterator itor = content.constBegin();itor != content.constEnd();itor++)
        {
            lua_pushnumber(L,itor.key());
            lua_pushstring(L,itor.value().toLatin1());
            lua_settable(L,-3);
        }

        // 获取 Lua 中的函数
        lua_getglobal(L,"mytable");
        // 将 table 压入栈顶作为函数的参数
        lua_pushvalue(L,-2);
        if(!lua_isnil(L,-1))
        {
            lua_pcall(L,1,1,0);
            //lua_call(L,4,1);
            if(lua_isstring(L,-1))
            {
                QString log = lua_tostring(L,-1);
                debug(log);
            }
        }
        lua_pop(L,1);
    }
    else {
        debug("脚本加载失败");
    }
    lua_close(L);
    L = nullptr;
}

void Widget::debug(QString s)
{
    //qDebug() << s;
    ui->textBrowser->append(s);
    ui->textBrowser->moveCursor(QTextCursor::End);
}
